# -*- mode: ruby -*-
# vi: set ft=ruby :

####
# This Vagrantfile is used in order to build a virtual image that runs the OperatorHub test-suite: https://k8s-operatorhub.github.io/community-operators/operator-test-suite/
#
# Bring it up with:
#
# VAGRANT_VAGRANTFILE=stackgres-k8s/install/operator-sdk/stackgres-operator/Vagrantfile.operatorhub-test-suite vagrant up
#
# After merging the operator bundle to the OperatorHub repository with the following script from folder `stackgres-k8s/install/operator-sdk/stackgres-operator`:
#
# ```
# . ~/.stackgres/operator-bundle-operatorhub-config && sh deploy-to-operatorhub.sh
# ```
# 
# You will be able to test the operator with OperatorHub test suite using the following command:
#
# ```
# export VAGRANT_VAGRANTFILE=Vagrantfile.operatorhub-test-suite
# tar cf target/fork-operatorhub.tar target/fork-operatorhub
# vagrant upload target/fork-operatorhub.tar
# vagrant ssh
# # Then inside the ssh shell
# tar xf fork-operatorhub.tar
# cd target/fork-operatorhub
# export OPP_DEBUG=3 GITHUB_OUTPUT=/dev/stdout
# bash <(curl -sL https://raw.githubusercontent.com/redhat-openshift-ecosystem/community-operators-pipeline/ci/latest/ci/scripts/opp.sh) all operators/stackgres/"<latest version>"
# ```
#
# To have a look to what is happening with k9s:
#
# ```
# export VAGRANT_VAGRANTFILE=Vagrantfile.operatorhub-test-suite
# vagrant ssh
# # Then inside the ssh shell
# k9s
# ```
###

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "generic/ubuntu2310"
  
  config.vm.provider :virtualbox

  config.vm.disk :disk, size: "20GB", primary: true
  
  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Disable the default share of the current code directory. Doing this
  # provides improved isolation between the vagrant box and your host
  # by making sure your Vagrantfile isn't accessible to the vagrant box.
  # If you use this you may want to enable additional shared subfolders as
  # shown above.
  # config.vm.synced_folder ".", "/vagrant", disabled: true

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = false
 
    # Customize the amount of memory on the VM:
    vb.memory = "8192"
  end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
  # documentation for more information about their specific syntax and use.
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y docker.io git ansible tar wget yq
    usermod -G docker -a vagrant
    wget https://github.com/kubernetes-sigs/kind/releases/download/v0.21.0/kind-linux-amd64 -O /usr/local/bin/kind
    chmod a+x /usr/local/bin/kind
    wget "https://dl.k8s.io/release/v1.29.1/bin/linux/amd64/kubectl" -O /usr/local/bin/kubectl
    chmod a+x /usr/local/bin/kubectl
    wget "https://github.com/derailed/k9s/releases/download/v0.31.7/k9s_Linux_amd64.tar.gz" -O -|tar xz -C /bin -f - k9s
  SHELL
end
